const { log } = console
// 多元函数 => 一元函数
const getSum = (a, b, c) => a + b + c

const curried = curry(getSum)

log(curried(1, 2, 3))
log(curried(1)(2, 3))
log(curried(1, 2)(3)) // 只剩余一个参数

// const curry = (f) => const curriedFn = (...args) => {
//   // 判断实参和形参的个数
//   if (args.length < f.length) {
//     return () => curriedFn(...args.concat(...args))
//     // 用arguments的话
//     // return () => curriedFn(...args.concat(Array.from(arguments)))
//   }
//   return f(...args)
// }

function curry(func) {
  return function curriedFn(...args) {
    //  实际参数的个数 < 形式参数的个数 返回新的函数
    if (args.length < func.length) {
      // 返回的函数需要等待更多参数
      // 闭包
      // 第二次传递的就是arguments args是上一次传递的参数 闭包保留了下来
      return function () {
        return curriedFn(...args.concat(Array.from(arguments)))
      }
    }
    // 如果实际参数 >= 形式参数 直接调用函数执行就可以了! apply或者...
    return func(...args)
  }
}

const fn = (a, b, c, d) => {}
console.log(fn.length)
